Mensch ärger dich nicht.py
Mensch ärger dich nicht.py
—
Python Source,
12 KB (12871 bytes)
Dateiinhalt
#Achtung Figuren schlagen hat Bugs
from visual import *
from threading import Thread
scene.range = 15 # fixed size, no autoscaling
'''scene.stereo="redcyan"'''
PORT = 51540
class feldinhalt(frame):
def __init__(self,nummer,farbe):
frame.__init__(self)
self.feldinhalt=ring(frame=self,pos=(0,0,0),radius=0.5,color=farbe,axis=(0,1,0),material=materials.diffuse)
self.nummer=nummer
class spielfigur(frame):
def __init__(self,nummer,farbe):
frame.__init__(self)
self.koerper=cylinder(frame=self,pos=(0,0,0),radius=0.45,color=farbe,axis=(0,1.5,0),material=materials.chrome)
self.Kopf=cone(frame=self,pos=(0,1.5,0),axis=(0,1,0),radius=0.45,color=farbe,material=materials.chrome)
self.nummer=nummer
self.ringnr = 0
self.anfangspos=self.pos
class spielfeld(Thread):
def __init__(self):
Thread.__init__(self)
self.aufbauen()
def aufbauen(self):
feld=box(pos=(0,0,0),length=22,height=0.05,width=22,color=(1.5,1.5,1.5),material=materials.wood)
#Ringe
self.ringliste=[]
self.figurenliste=[]
for i in range(-20,0):
self.s1= feldinhalt(i,farbe=color.red)
self.s2= feldinhalt(i+20,farbe=color.red)
self.s3= feldinhalt(i+40,farbe=color.red)
self.s4= feldinhalt(i+60,farbe=color.red)
self.s1.pos=(10+i,0.1,-10)
self.s2.pos=(10,0.1,10+i)
self.s3.pos=(10+i,0.1,10)
self.s4.pos=(-10,0.1,10+i)
self.ringliste.append(self.s1)
self.ringliste.append(self.s2)
self.ringliste.append(self.s3)
self.ringliste.append(self.s4)
for u in range(0,2):
self.s5=feldinhalt(-u-405,farbe=color.black)
self.s5.pos=(7+u,0.1,7)
self.s6=feldinhalt(-u-408,farbe=color.black)
self.s6.pos=(7+u,0.1,8)
self.s7=feldinhalt(-u-411,farbe=color.green)
self.s7.pos=(-8+u,0.1,-7)
self.s8=feldinhalt(-u-414,farbe=color.green)
self.s8.pos=(-8+u,0.1,-8)
self.s9=feldinhalt(u+405,farbe=color.blue)
self.s9.pos=(-8+u,0.1,7)
self.s10=feldinhalt(u+408,farbe=color.blue)
self.s10.pos=(-8+u,0.1,8)
self.s11=feldinhalt(u+411,farbe=color.orange)
self.s11.pos=(7+u,0.1,-7)
self.s12=feldinhalt(u+414,farbe=color.orange)
self.s12.pos=(7+u,0.1,-8)
self.ringliste.append(self.s5)
self.ringliste.append(self.s6)
self.ringliste.append(self.s7)
self.ringliste.append(self.s8)
self.ringliste.append(self.s9)
self.ringliste.append(self.s10)
self.ringliste.append(self.s11)
self.ringliste.append(self.s12)
for o in range(-9,-5):
self.d1=feldinhalt(o+1000,farbe=color.blue)
self.d1.pos=(o,0.1,0)
self.d2=feldinhalt(-o+1500,farbe=color.green)
self.d2.pos=(0,0.1,o)
self.ringliste.append(self.d1)
self.ringliste.append(self.d2)
for p in range(6,10):
self.d3=feldinhalt(-p+2000,farbe=color.orange)
self.d3.pos=(p,0.1,0)
self.d4=feldinhalt(p+2500,farbe=color.black)
self.d4.pos=(0,0.1,p)
self.ringliste.append(self.d3)
self.ringliste.append(self.d4)
for l in range(0,1):
self.w1= feldinhalt(-l+3000,farbe=color.orange)
self.w2= feldinhalt(-l+3500,farbe=color.green)
self.w3= feldinhalt(l+4000,farbe=color.black)
self.w4= feldinhalt(l+4500,farbe=color.blue)
self.w1.pos=(10+l,0.1,-10)
self.w2.pos=(-10,0.1,-10+l)
self.w3.pos=(10+l,0.1,10)
self.w4.pos=(-10,0.1,10+l)
self.ringliste.append(self.w1)
self.ringliste.append(self.w2)
self.ringliste.append(self.w3)
self.ringliste.append(self.w4)
###Figuren
for i in range(0,1):
self.r1 = spielfigur(1,farbe=color.green)
self.r2 = spielfigur(2,farbe=color.green)
self.r3 = spielfigur(3,farbe=color.green)
self.r4 = spielfigur(4,farbe=color.green)
self.r1.anfangspos=self.r1.pos=(-8+i,0.05,-7)
self.r2.anfangspos=self.r2.pos=(-8+i,0.05,-8)
self.r3.anfangspos=self.r3.pos=(-7+i,0.05,-7)
self.r4.anfangspos=self.r4.pos=(-7+i,0.05,-8)
self.r5 = spielfigur(5,farbe=color.black)
self.r6 = spielfigur(6,farbe=color.black)
self.r7 = spielfigur(7,farbe=color.black)
self.r8 = spielfigur(8,farbe=color.black)
self.r5.anfangspos=self.r5.pos=(7+i,0.05,7)
self.r6.anfangspos=self.r6.pos=(7+i,0.05,8)
self.r7.anfangspos=self.r7.pos=(8+i,0.05,7)
self.r8.anfangspos=self.r8.pos=(8+i,0.05,8)
self.r9 = spielfigur(9,farbe=color.blue)
self.r10 = spielfigur(10,farbe=color.blue)
self.r11 = spielfigur(11,farbe=color.blue)
self.r12 = spielfigur(12,farbe=color.blue)
self.r9.anfangspos=self.r9.pos=(-8+i,0.05,7)
self.r10.anfangspos=self.r10.pos=(-8+i,0.05,8)
self.r11.anfangspos=self.r11.pos=(-7+i,0.05,7)
self.r12.anfangspos=self.r12.pos=(-7+i,0.05,8)
self.r13 = spielfigur(13,farbe=color.orange)
self.r14 = spielfigur(14,farbe=color.orange)
self.r15 = spielfigur(15,farbe=color.orange)
self.r16 = spielfigur(16,farbe=color.orange)
self.r13.anfangspos=self.r13.pos=(7+i,0.05,-7)
self.r14.anfangspos=self.r14.pos=(7+i,0.05,-8)
self.r15.anfangspos=self.r15.pos=(8+i,0.05,-7)
self.r16.anfangspos=self.r16.pos=(8+i,0.05,-8)
self.figurenliste.append(self.r1)
self.figurenliste.append(self.r2)
self.figurenliste.append(self.r3)
self.figurenliste.append(self.r4)
self.figurenliste.append(self.r5)
self.figurenliste.append(self.r6)
self.figurenliste.append(self.r7)
self.figurenliste.append(self.r8)
self.figurenliste.append(self.r9)
self.figurenliste.append(self.r10)
self.figurenliste.append(self.r11)
self.figurenliste.append(self.r12)
self.figurenliste.append(self.r13)
self.figurenliste.append(self.r14)
self.figurenliste.append(self.r15)
self.figurenliste.append(self.r16)
def figur_setzen(self,figurnr,zielnr):
for f in self.figurenliste:
if f.nummer==figurnr:
figur=f
break
for ring in self.ringliste:
if ring.nummer==zielnr:
figur.pos=ring.pos
figur.ringnr=ring.nummer
break
def run(self):
figurnr = -1 #die figurnummer
zielnr = -1 #die zielposition (als nummer)
pick = None # no object picked out of the scene yet
while True:
rate(30)
if scene.mouse.events:
m1 = scene.mouse.getevent() # get event
if m1.drag and m1.pick:
for f in self.figurenliste:
if m1.pick in f.objects:
figurnr=f.nummer
altpos=m1.pickpos-(m1.pickpos-f.pos)
break
else:
f = None
drag_pos =m1.pickpos
drag_pos.y = 0
pick = f
elif m1.drop and pick: # released at end of drag
for ring in self.ringliste:
ringmitte = ring.pos
if mag(ringmitte-pick.pos) < .5:
f.pos = ringmitte
zielnr=ring.nummer
pick=None
for g in self.figurenliste:
if g.pos==f.pos:
g.pos=g.anfangspos
break
zufall=int(random.random()*6+1)
augen=label(text=str(zufall),pos=(0,0,0),depth=-0.3,color=color.cyan)
break
if not f.pos in [ring.pos for ring in self.ringliste]:
f.pos=altpos
pick=None
#--------------------#
self.controller.weiterleiten(str(figurnr)+","+str(zielnr))
#--------------------#
#self.figur_setzen(figurnr,zielnr)
pick = None
if pick:
# project onto xy plane, even if scene rotated:
new_pos = scene.mouse.project(normal=(0,1,0))
if new_pos != drag_pos :# if mouse has moved
pick.pos += new_pos - drag_pos
drag_pos = new_pos # update drag position+
pick.pos = new_pos + pick.pos - drag_pos
drag_pos = new_pos # update drag position
# offset for where the ball was clicked:
zufall=int(random.random()*6+1)
augen=label(text=str(zufall),pos=(0,0,0),depth=-0.3,color=color.cyan)
'''Diese Klasse ermoeglicht die Netzkommunikation. Bau sie in dein Projekt ein.
Die eigentliche Spielklasse braucht ein Referenzattribut auf ein Objekt dieser Steuerungs-Klasse,
und kann dann mittels der Steuerungs-Methode weiterleiten(nachricht) einen String an die
Steuerung schicken, die ihrerseits das an den Server weiterleitet. (Was der Server macht, steht
in der Datei "server_class.py", die sich im selben Verzeichnis befinden muss.)
Der Konstruktor verlangt ein Objekt, dem er die Nachrichten des Servers schicken soll, also das
eigentliche Spiel, und optional einen Port. Jedes Team sollte eine eigene fuenstellige Portnummer
waehlen.'''
class Steuerung(Thread):
def __init__(self, spiel, port=51540):
Thread.__init__(self)
self.view=spiel
# UDP-Client, der den Server als Subprozess startet
import subprocess # Modul zum Starten von Subprozessen
import socket # Modul fuer Netzwerkkommunikation
self.PORT = port
#Anlegen eines Socket
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # AF_INET = IPv4, SOCK_DGRAM = UDP
self.s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) # Broadcast ermoeglichen
#Testen, ob es schon einen Server auf diesem Port gibt, notfalls selber starten
try:
self.s.sendto("print 'wer hoert mich?'",
('255.255.255.255', self.PORT)) # sende Nachricht 'an alle'
self.s.settimeout(2) # warte 1/2 Sekunde..
print (self.s.recvfrom(64)[0]) # gibt Servermeldung aus
#ein Problem, wenn timeout einmal gesetzt ist...
self.s.settimeout(3000)
except: # reagiert auf Zeitueberschreitung
print ("Kein Server vorhanden - starte Server") # Rueckmeldung
subprocess.Popen(['python','server_class.py',str(self.PORT)]) # Server starten
self.s.setblocking(1) # nicht-blockierend
self.s.sendto("print 'hallo'", ('255.255.255.255', self.PORT))
self.start()
#Endlosmethode zum Abhoeren des Ports auf Nachrichten
def run(self):
while True:
nachricht = self.s.recvfrom(128)[0]
self.auswerten(nachricht)
#Methode zum Auswerten der eingegangenen Nachricht
def auswerten(self,nachricht):
exec (nachricht)
#Methode zum Weiterleiten, wird von Spiel genutzt
def weiterleiten(self, nachricht):
# HIER CODE EINFUEGEN, DER AUSGEFUEHRT WERDEN SOLL
teile=nachricht.split(",")
nachricht = "self.view.figur_setzen("+teile[0]+","+teile[1]+")"
self.s.sendto(nachricht, ('255.255.255.255', self.PORT)) # versenden der Nachricht an Tupel(IP, PORT)
if __name__ == "__main__":
spiel = spielfeld() #das eigentliche Spiel
steuerung = Steuerung(spiel, PORT) #Die Steuerung, mit dem Spiel und einem Port als Argument
spiel.controller = steuerung #Setzen des Referenzattributs
spiel.run() #Das Spiel muss von Thread erben, hier wird dessen run-Methode gestartet